home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 7
/
Apprentice-Release7.iso
/
Source Code
/
Pascal
/
Snippets
/
PNL Libraries
/
MyDES.p
< prev
next >
Wrap
Text File
|
1996-05-31
|
11KB
|
371 lines
unit MyDES;
interface
uses
Types;
{$PUSH}
{$ALIGN MAC68K}
type
desData = record
case boolean of
false: (
hi: longint;
lo: longint;
);
true: (
bytes: packed array[1..8] of Byte;
)
end;
{$ALIGN RESET}
{$POP}
procedure StartupDES;
procedure EncryptDES (var plain, key, cipher: desData);
procedure DecryptDES (var cipher, key, plain: desData);
implementation
uses
Resources, Errors,
MyStartup;
const
kInitalTr = 8;
kFinalTr = 9;
kKeyTr1 = 10;
kKeyTr2 = 11;
kFiddle = 12;
type
posType = 0..63;
mappingType = packed array[posType] of Byte;
var
mappings: array[0..12] of mappingType;
procedure ReMap (var data: desData; map: integer);
var
i: integer;
t: desData;
tmp: longint;
begin
t := data;
data.lo := 0;
data.hi := 0;
i := 0;
tmp := $80000000;
while (tmp <> 0) do begin
if mappings[map, i] >= 128 then begin
if BTST(t.hi, mappings[map, i] - 128) then begin
data.hi := BOR(data.hi, tmp);
end; {if}
end else begin
if BTST(t.lo, mappings[map, i]) then begin
data.hi := BOR(data.hi, tmp);
end; {if}
end; {if}
tmp := BSR(tmp, 1);
i := i + 1;
end; {while}
tmp := $80000000;
while (tmp <> 0) do begin
if mappings[map, i] >= 128 then begin
if BTST(t.hi, mappings[map, i] - 128) then begin
data.lo := BOR(data.lo, tmp);
end; {if}
end else begin
if BTST(t.lo, mappings[map, i]) then begin
data.lo := BOR(data.lo, tmp);
end; {if}
end; {if}
tmp := BSR(tmp, 1);
i := i + 1;
end; {while}
end;
procedure KeyRotateLeft (var key: desData);
begin
key.lo := BROTL(key.lo, 1);
if BTST(key.lo, 28) then begin
key.lo := BAND(BOR(key.lo, $00000001), $0FFFFFFF);
end else begin
key.lo := BAND(key.lo, $0FFFFFFE);
end; {if}
key.hi := BROTL(key.hi, 1);
if BTST(key.hi, 28) then begin
key.hi := BAND(BOR(key.hi, $00000001), $0FFFFFFF);
end else begin
key.hi := BAND(key.hi, $0FFFFFFE);
end; {if}
end;
procedure KeyRotateRight (var key: desData);
begin
key.lo := BROTR(key.lo, 1);
if BTST(key.lo, 31) then begin
key.lo := BAND(BOR(key.lo, $08000000), $0FFFFFFF);
end else begin
key.lo := BAND(key.lo, $07FFFFFF);
end; {if}
key.hi := BROTR(key.hi, 1);
if BTST(key.hi, 31) then begin
key.hi := BAND(BOR(key.hi, $08000000), $0FFFFFFF);
end else begin
key.hi := BAND(key.hi, $07FFFFFF);
end; {if}
end;
procedure Stage (var key, cipher: desData);
var
i: integer;
t: longint;
tmp: desData;
begin
tmp.lo := 0;
tmp.hi := 0;
t := BROTL(cipher.lo, 1);
for i := 1 to 8 do begin
t := BROTL(t, 4);
tmp.bytes[i] := BAND(t, $0FF);
end;
i := 0;
t := $80000000;
while (t <> 0) do begin
if BTST(key.hi, mappings[kKeyTr2, i]) then begin
tmp.hi := BXOR(tmp.hi, t);
end; {if}
t := BSR(t, 1);
i := i + 1;
end; {while}
t := $80000000;
while (t <> 0) do begin
if BTST(key.lo, mappings[kKeyTr2, i]) then begin
tmp.lo := BXOR(tmp.lo, t);
end; {if}
t := BSR(t, 1);
i := i + 1;
end; {while}
tmp.hi := BAND(tmp.hi, $3F3F3F3F);
tmp.lo := BAND(tmp.lo, $3F3F3F3F);
t := 0;
for i := 0 to 7 do begin
t := BOR(BROTL(t, 4), mappings[i, tmp.bytes[i+1]]);
end; {for}
tmp.lo := t;
i := 0;
t := $80000000;
while (t <> 0) do begin
if BTST(tmp.lo, mappings[kFiddle, i]) then begin
cipher.hi := BXOR(cipher.hi, t);
end; {if}
t := BSR(t, 1);
i := i + 1;
end; {while}
end;
procedure EncryptDES (var plain, key, cipher: desData);
var
tmpkey: desData;
t: longint;
rots: longint;
begin
tmpkey := key;
ReMap(tmpkey, kKeyTr1);
tmpkey.lo := BAND(tmpkey.lo, $0FFFFFFF);
tmpkey.hi := BAND(tmpkey.hi, $0FFFFFFF);
cipher := plain;
ReMap(cipher, kInitalTr);
{0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0}
rots := $0000C081;
while (rots <> 0) do begin
KeyRotateLeft(tmpkey);
Stage(tmpkey, cipher);
if not BTST(rots, 0) then begin
KeyRotateLeft(tmpkey);
end;
rots := BSR(rots, 1);
if rots <> 0 then begin
t := cipher.lo;
cipher.lo := cipher.hi;
cipher.hi := t;
end; {if}
end; {while}
ReMap(cipher, kFinalTr);
end;
procedure DecryptDES (var cipher, key, plain: desData);
var
tmpkey: desData;
t: longint;
rots: longint;
begin
tmpkey := key;
ReMap(tmpkey, kKeyTr1);
tmpkey.lo := BAND(tmpkey.lo, $0FFFFFFF);
tmpkey.hi := BAND(tmpkey.hi, $0FFFFFFF);
plain := cipher;
ReMap(plain, kInitalTr);
t := plain.lo;
plain.lo := plain.hi;
plain.hi := t;
{0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0}
rots := $0000C081;
while (rots <> 0) do begin
t := plain.lo;
plain.lo := plain.hi;
plain.hi := t;
Stage(tmpkey, plain);
KeyRotateRight(tmpkey);
if not BTST(rots, 0) then begin
KeyRotateRight(tmpkey);
end;
rots := BSR(rots, 1);
end; {while}
ReMap(plain, kFinalTr);
end;
{$IFC 0}
procedure SetupMappings;
procedure InitMapping (var o: mappingType; a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, a62, a63: Byte);
begin
o[0] := a00;
o[1] := a01;
o[2] := a02;
o[3] := a03;
o[4] := a04;
o[5] := a05;
o[6] := a06;
o[7] := a07;
o[8] := a08;
o[9] := a09;
o[10] := a10;
o[11] := a11;
o[12] := a12;
o[13] := a13;
o[14] := a14;
o[15] := a15;
o[16] := a16;
o[17] := a17;
o[18] := a18;
o[19] := a19;
o[20] := a20;
o[21] := a21;
o[22] := a22;
o[23] := a23;
o[24] := a24;
o[25] := a25;
o[26] := a26;
o[27] := a27;
o[28] := a28;
o[29] := a29;
o[30] := a30;
o[31] := a31;
o[32] := a32;
o[33] := a33;
o[34] := a34;
o[35] := a35;
o[36] := a36;
o[37] := a37;
o[38] := a38;
o[39] := a39;
o[40] := a40;
o[41] := a41;
o[42] := a42;
o[43] := a43;
o[44] := a44;
o[45] := a45;
o[46] := a46;
o[47] := a47;
o[48] := a48;
o[49] := a49;
o[50] := a50;
o[51] := a51;
o[52] := a52;
o[53] := a53;
o[54] := a54;
o[55] := a55;
o[56] := a56;
o[57] := a57;
o[58] := a58;
o[59] := a59;
o[60] := a60;
o[61] := a61;
o[62] := a62;
o[63] := a63;
end;
begin
InitMapping(mappings[kInitalTr], 6, 14, 22, 30, 134, 142, 150, 158, 4, 12, 20, 28, 132, 140, 148, 156, 2, 10, 18, 26, 130, 138, 146, 154, 0, 8, 16, 24, 128, 136, 144, 152, 7, 15, 23, 31, 135, 143, 151, 159, 5, 13, 21, 29, 133, 141, 149, 157, 3, 11, 19, 27, 131, 139, 147, 155, 1, 9, 17, 25, 129, 137, 145, 153);
InitMapping(mappings[kFinalTr], 24, 152, 16, 144, 8, 136, 0, 128, 25, 153, 17, 145, 9, 137, 1, 129, 26, 154, 18, 146, 10, 138, 2, 130, 27, 155, 19, 147, 11, 139, 3, 131, 28, 156, 20, 148, 12, 140, 4, 132, 29, 157, 21, 149, 13, 141, 5, 133, 30, 158, 22, 150, 14, 142, 6, 134, 31, 159, 23, 151, 15, 143, 7, 135);
InitMapping(mappings[kKeyTr1], 0, 0, 0, 0, 7, 15, 23, 31, 135, 143, 151, 159, 6, 14, 22, 30, 134, 142, 150, 158, 5, 13, 21, 29, 133, 141, 149, 157, 4, 12, 20, 28, 0, 0, 0, 0, 1, 9, 17, 25, 129, 137, 145, 153, 2, 10, 18, 26, 130, 138, 146, 154, 3, 11, 19, 27, 131, 139, 147, 155, 132, 140, 148, 156);
InitMapping(mappings[kKeyTr2], 0, 0, 14, 11, 17, 4, 27, 23, 0, 0, 25, 0, 13, 22, 7, 18, 0, 0, 5, 9, 16, 24, 2, 20, 0, 0, 12, 21, 1, 8, 15, 26, 0, 0, 15, 4, 25, 19, 9, 1, 0, 0, 26, 16, 5, 11, 23, 8, 0, 0, 12, 7, 17, 0, 22, 3, 0, 0, 10, 14, 6, 20, 27, 24);
InitMapping(mappings[kFiddle], 16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
InitMapping(mappings[7], 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11);
InitMapping(mappings[6], 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12);
InitMapping(mappings[5], 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13);
InitMapping(mappings[4], 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3);
InitMapping(mappings[3], 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14);
InitMapping(mappings[2], 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12);
InitMapping(mappings[1], 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9);
InitMapping(mappings[0], 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13);
end;
procedure CreateResource;
var
fs: FSSpec;
resfile: integer;
hhhh: Handle;
err: OSErr;
begin
SetupMappings;
err := FSMakeFSSpec(0, 0, 'Zany:DESData', fs);
err := FSpDelete(fs);
FSpCreateResFile(fs, 'RSED', 'rsrc', 0);
resfile := FSpOpenResFile(fs, fsRdWrPerm);
if resfile <> -1 then begin
err := PtrToHand(@mappings, hhhh, SizeOf(mappings));
AddResource(hhhh, 'DESd', 128, '');
CloseResFile(resfile);
end;
end;
{$ENDC}
function InitDES(var msg: integer):OSStatus;
var
err: OSErr;
hhhh: Handle;
begin
{$unused(msg)}
hhhh := GetResource('DESd', 128);
if (hhhh = nil) | (hhhh^ = nil) | (GetHandleSize(hhhh) <> SizeOf(mappings)) then begin
err := resNotFound;
end else begin
BlockMoveData(hhhh^, @mappings, SizeOf(mappings));
ReleaseResource(hhhh);
err := noErr;
end;
InitDES:=err;
end;
procedure StartupDES;
begin
SetStartup(InitDES, nil, 0, nil);
end;
end.